home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-01-23 | 21.2 KB | 724 lines | [TEXT/CWIE] |
- /******************** ***********************/
- //
- // Player PRO 4.6 - DRIVER SOURCE CODE -
- //
- // Library Version 4.6
- //
- // To use with MAD Library for Mac: Symantec, CodeWarrior and MPW
- //
- // Antoine ROSSET
- // 16 Tranchees
- // 1206 GENEVA
- // SWITZERLAND
- //
- // COPYRIGHT ANTOINE ROSSET 1996, 1997, 1998
- //
- // Thank you for your interest in PlayerPRO !
- //
- // FAX: (+41 22) 346 11 97
- // PHONE: (+41 79) 203 74 62
- // Internet: rosset@dial.eunet.ch or RossetAntoine@bluewin.ch
- //
- /******************** ***********************/
-
- #include "RDriver.h"
- #include "RDriverInt.h"
-
- void MADCreateOverShoot( MADDriverRec *intDriver)
- {
- long i, x;
-
- switch( intDriver->DriverSettings.outPutBits)
- {
- case 16:
- if( intDriver->DriverSettings.MicroDelay) intDriver->DASCBuffer = (long*) MADNewPtrClear( ( (long) intDriver->ASCBUFFER * 8L) + intDriver->MDelay*2L*8L, intDriver->lib);
- else intDriver->DASCBuffer = (long*) MADNewPtrClear( ( (long) intDriver->ASCBUFFER * 8L), intDriver->lib); // Le Clear est indispensable !!
- break;
-
- case 8:
- if( intDriver->DriverSettings.MicroDelay) intDriver->DASCBuffer8 = (short*) MADNewPtrClear( ( (long) intDriver->ASCBUFFER * 4L) + intDriver->MDelay*2L*4L, intDriver->lib);
- else intDriver->DASCBuffer8 = (short*) MADNewPtrClear( ( (long) intDriver->ASCBUFFER * 4L), intDriver->lib); // Le Clear est indispensable !!
-
- intDriver->OverShoot = (Ptr) MADNewPtrClear( 256L * 32L, intDriver->lib);
-
- for( i = 0; i < 256L * 16L; i++) intDriver->OverShoot[ i] = 0;
- for( i = 256L * 16L, x = 0; i < 256L * 17L; i++, x++) intDriver->OverShoot[ i] = x;
- for( i = 256L * 17L; i < 256L * 32L; i++) intDriver->OverShoot[ i] = 0xFF;
-
-
- intDriver->OverShoot += 256L*16L;
- intDriver->OverShoot += 128L;
- break;
- }
- }
-
- void MADKillOverShoot( MADDriverRec *intDriver)
- {
- switch( intDriver->DriverSettings.outPutBits)
- {
- case 16:
- if( intDriver->DASCBuffer != 0L) DisposePtr( (Ptr) intDriver->DASCBuffer);
- intDriver->DASCBuffer = 0L;
- break;
-
- case 8:
- if( intDriver->OverShoot != 0L)
- {
- intDriver->OverShoot -= 128L;
- intDriver->OverShoot -= 256L*16L;
- DisposePtr( (Ptr) intDriver->OverShoot);
- intDriver->OverShoot = 0L;
- }
-
- if( intDriver->DASCBuffer8 != 0L) DisposePtr( (Ptr) intDriver->DASCBuffer8);
- intDriver->DASCBuffer8 = 0L;
- break;
- }
- }
-
- void Sampler16AddDeluxe( Channel *curVoice, register long *ASCBuffer, MADDriverRec *intDriver)
- {
- Ptr SndBuffer;
- short *VolPtr, *VolPtr2;
- long LRVol = intDriver->LeftRight[ curVoice->ID];
- Byte tByte = 0;
- long off, i = intDriver->ASCBUFFER;
-
- ///
- long aDD, aCC = curVoice->lAC;
-
- aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / ( curVoice->period * (intDriver->DriverSettings.outPutRate>>16));
- ///
-
- //*****************************************
- //*****************************************
- //*****************************************
- if( intDriver->DriverSettings.TickRemover) MADTickRemoverStart8( curVoice, ASCBuffer, ASCBuffer+1, intDriver);
- //*****************************************
- //*****************************************
- //*****************************************
-
- if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize == 0) return;
-
- SndBuffer = curVoice->curPtr;
- VolPtr2 = (short*) ( intDriver->Vol + (((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID] * LRVol)/ (REDUCEVOLUME)) << 8) * 2L);
- LRVol = 100 - LRVol;
- VolPtr = (short*) ( intDriver->Vol + (((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID] * LRVol)/ (REDUCEVOLUME)) << 8) * 2L);
-
- if( SndBuffer + 1 + (long) ((aCC + aDD * intDriver->ASCBUFFER)>>BYTEDIV) >= curVoice->maxPtr)
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = (aCC>>BYTEDIV);
- if( SndBuffer + off + 1 >= curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- long before;
-
- if( i >= intDriver->ASCBUFFER-1)
- {
- before = curVoice->lastWord >> 8;
- }
- else
- {
- aCC -= aDD;
- before = *(SndBuffer + (aCC>>BYTEDIV));
- aCC += aDD;
- }
-
- SndBuffer -= curVoice->loopSize;
- if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
-
- //*****************************************
- //*****************************************
- //*****************************************
- if( intDriver->DriverSettings.TickRemover) MADTickRemoverLoop8( i, curVoice, ASCBuffer, ASCBuffer+1, intDriver, before - *(SndBuffer + off));
- //*****************************************
- //*****************************************
- //*****************************************
-
- }
- else // If TICK remove
- {
-
- //*****************************************
- //*****************************************
- //*****************************************
- if( intDriver->DriverSettings.TickRemover) MADTickLoopFill8( curVoice, ASCBuffer, ASCBuffer+1, i, *(VolPtr + tByte), *(VolPtr2 + tByte));
- //*****************************************
- //*****************************************
- //*****************************************
-
- break;
- }
- }
- tByte = ( LeftWeight * *(SndBuffer + off) +
- RightWeight * *(SndBuffer + off + 1)) >> BYTEDIV; aCC += aDD;
-
- *ASCBuffer++ += *(VolPtr + tByte);
- *ASCBuffer++ += *(VolPtr2 + tByte);
- }
- }
- else
- {
- while( i-- > 0)
- {
- off = (aCC>>BYTEDIV);
- if( SndBuffer + off >= curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- long before;
-
- if( i >= intDriver->ASCBUFFER-1) before = curVoice->lastWord >> 8;
- else
- {
- aCC -= aDD;
- before = *(SndBuffer + (aCC>>BYTEDIV));
- aCC += aDD;
- }
-
- SndBuffer -= curVoice->loopSize;
- if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
-
- //*****************************************
- //*****************************************
- //*****************************************
- if( intDriver->DriverSettings.TickRemover) MADTickRemoverLoop8( i, curVoice, ASCBuffer, ASCBuffer+1, intDriver, before - *(SndBuffer + off));
- //*****************************************
- //*****************************************
- //*****************************************
- }
- else // If TICK remove
- {
- //*****************************************
- //*****************************************
- //*****************************************
- if( intDriver->DriverSettings.TickRemover) MADTickLoopFill8( curVoice, ASCBuffer, ASCBuffer+1, i, *(VolPtr + tByte), *(VolPtr2 + tByte));
- //*****************************************
- //*****************************************
- //*****************************************
-
- break;
- }
- }
-
- tByte = (Byte) *(SndBuffer + off); aCC += aDD;
- *ASCBuffer++ += *(VolPtr + tByte);
- *ASCBuffer++ += *(VolPtr2 + tByte);
- }
- }
-
- if( curVoice->loopSize > 0) curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
- else
- {
- curVoice->samplePtr = 0L; curVoice->curPtr = curVoice->maxPtr;
- }
- }
- else
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = (aCC>>BYTEDIV);
- tByte = ( LeftWeight * *(SndBuffer + off) +
- RightWeight * *(SndBuffer + off + 1)) >> BYTEDIV; aCC += aDD;
-
- *ASCBuffer++ += *(VolPtr + tByte);
- *ASCBuffer++ += *(VolPtr2 + tByte);
- }
- }
- else
- {
- while( i-- > 0)
- {
- off = aCC>>BYTEDIV;
- tByte = (Byte) *(SndBuffer + off); aCC += aDD;
- *ASCBuffer++ += *(VolPtr + tByte);
- *ASCBuffer++ += *(VolPtr2 + tByte);
- }
- }
-
- curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
- }
-
- curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
-
- aCC -= aDD;
- curVoice->lastWord = *(SndBuffer + (long) (aCC>>BYTEDIV));
- curVoice->lastWord <<= 8;
- }
-
- void Sampler16Addin16Deluxe( Channel *curVoice, register long *ASCBuffer, MADDriverRec *intDriver)
- {
- long i = intDriver->ASCBUFFER;
- short *SndBuffer, tShort;
- long LRVol = intDriver->LeftRight[ curVoice->ID], chnVol, chnVol2;
- long off;
-
- ///
- long aDD, aCC = curVoice->lAC;
-
- aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / ( curVoice->period * (intDriver->DriverSettings.outPutRate>>16));
- ///
-
- //*****************************************
- //*****************************************
- //*****************************************
- if( intDriver->DriverSettings.TickRemover) MADTickRemoverStart8( curVoice, ASCBuffer, ASCBuffer+1, intDriver);
- //*****************************************
- //*****************************************
- //*****************************************
-
-
- if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize == 0) return;
-
- SndBuffer = (short*) curVoice->curPtr;
-
- chnVol2 = ((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID] * LRVol)/ REDUCEVOLUME);
- LRVol = 100 - LRVol;
- chnVol = ((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID] * LRVol)/ REDUCEVOLUME);
-
- if( SndBuffer + 1L + (long) ((aCC + aDD * intDriver->ASCBUFFER)>>BYTEDIV) >= ( short*) curVoice->maxPtr)
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = (aCC>>BYTEDIV);
- if( SndBuffer + off + 1 >= (short*) curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- long before;
-
- if( i >= intDriver->ASCBUFFER-1)
- {
- before = curVoice->lastWord;
- }
- else
- {
- aCC -= aDD;
- before = *(SndBuffer + (aCC>>BYTEDIV));
- aCC += aDD;
- }
-
- SndBuffer -= curVoice->loopSize/2;
- if( SndBuffer + off < (short*) curVoice->begPtr) SndBuffer = (short*) curVoice->begPtr - off;
-
- //*****************************************
- //*****************************************
- //*****************************************
- if( intDriver->DriverSettings.TickRemover) MADTickRemoverLoop16( i, curVoice, ASCBuffer, ASCBuffer+1, intDriver, before - *(SndBuffer + off));
- //*****************************************
- //*****************************************
- //*****************************************
-
- }
- else // If TICK remove
- {
-
- //*****************************************
- //*****************************************
- //*****************************************
- if( intDriver->DriverSettings.TickRemover) MADTickLoopFill8( curVoice, ASCBuffer, ASCBuffer+1, i, (tShort * chnVol) >> 6, (tShort * chnVol2) >> 6);
- //*****************************************
- //*****************************************
- //*****************************************
-
- break;
- }
- }
- tShort = ( LeftWeight * *(SndBuffer + off) +
- RightWeight * *(SndBuffer + off + 1)) >> BYTEDIV; aCC += aDD;
-
- *ASCBuffer++ += (tShort * chnVol) >> 6;
- *ASCBuffer++ += (tShort * chnVol2) >> 6;
- }
- }
- else
- {
- while( i-- > 0)
- {
- off = (aCC>>BYTEDIV);
- if( SndBuffer + off >= (short*) curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- long before;
-
- if( i >= intDriver->ASCBUFFER-1)
- {
- before = curVoice->lastWord;
- }
- else
- {
- aCC -= aDD;
- before = *(SndBuffer + (aCC>>BYTEDIV));
- aCC += aDD;
- }
-
- SndBuffer -= curVoice->loopSize/2;
- if( SndBuffer + off < (short*) curVoice->begPtr) SndBuffer = (short*) curVoice->begPtr - off;
-
- //*****************************************
- //*****************************************
- //*****************************************
- if( intDriver->DriverSettings.TickRemover) MADTickRemoverLoop16( i, curVoice, ASCBuffer, ASCBuffer+1, intDriver, before - *(SndBuffer + off));
- //*****************************************
- //*****************************************
- //*****************************************
-
- }
- else // If TICK remove
- {
-
- //*****************************************
- //*****************************************
- //*****************************************
- if( intDriver->DriverSettings.TickRemover) MADTickLoopFill8( curVoice, ASCBuffer, ASCBuffer+1, i, (tShort * chnVol) >> 6, (tShort * chnVol2) >> 6);
- //*****************************************
- //*****************************************
- //*****************************************
-
- break;
- }
- }
- tShort = *(SndBuffer + off); aCC += aDD;
-
- *ASCBuffer++ += (tShort * chnVol) >> 6;
- *ASCBuffer++ += (tShort * chnVol2) >> 6;
- }
- }
-
- if( curVoice->loopSize > 0) curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
- else { curVoice->samplePtr = 0L; curVoice->curPtr = curVoice->maxPtr; }
- }
- else
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = (aCC>>BYTEDIV);
- tShort = ( LeftWeight * *(SndBuffer + off) +
- RightWeight * *(SndBuffer + off + 1)) >> BYTEDIV; aCC += aDD;
-
- *ASCBuffer++ += (tShort * chnVol) >> 6;
- *ASCBuffer++ += (tShort * chnVol2) >> 6;
- }
- }
- else
- {
- while( i-- > 0)
- {
- off = (aCC>>BYTEDIV);
- tShort = *(SndBuffer + off); aCC += aDD;
-
- *ASCBuffer++ += (tShort * chnVol) >> 6;
- *ASCBuffer++ += (tShort * chnVol2) >> 6;
- }
- }
- curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
- }
-
- curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
-
- aCC -= aDD;
- curVoice->lastWord = *(SndBuffer + (long) (aCC>>BYTEDIV));
- }
-
- void Sample16BufferAddDeluxe( Channel *curVoice, register long *ASCBuffer, MADDriverRec *intDriver)
- {
- // if( curVoice->period == 0) Debugger();
- if( curVoice->amp == 16) Sampler16Addin16Deluxe( curVoice, ASCBuffer, intDriver);
- else if( curVoice->amp == 8) Sampler16AddDeluxe( curVoice, ASCBuffer, intDriver);
- }
-
- void Play16StereoDeluxe( MADDriverRec *intDriver)
- {
- short *ASCBuffer, valP = 0x7FFFL, valN = -0x7FFFL;
- long *ttt, i;
-
- for( i = 0 ; i < intDriver->DriverSettings.numChn; i++) Sample16BufferAddDeluxe( &intDriver->chan[ i], intDriver->DASCBuffer, intDriver);
-
- ttt = intDriver->DASCBuffer;
- ASCBuffer = (short*) intDriver->IntDataPtr;
-
- i = intDriver->ASCBUFFER*2;
-
- while( i-- > 0)
- {
- if( *ttt > valP) *ASCBuffer++ = valP;
- else if( *ttt < valN) *ASCBuffer++ = valN;
- else *ASCBuffer++ = *ttt;
-
- *ttt++ = 0;
- }
- }
-
- void Sampler8in8AddDeluxe( Channel *curVoice, register short *ASCBuffer, MADDriverRec *intDriver)
- {
- char *SndBuffer;
- Byte tByte;
- long i = intDriver->ASCBUFFER, LRVol = intDriver->LeftRight[ curVoice->ID];
- Ptr VolPtr, VolPtr2;
- long off;
-
- ///
- long aDD, aCC = curVoice->lAC;
-
- aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / ( curVoice->period * (intDriver->DriverSettings.outPutRate>>16));
- ///
-
- if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize == 0) return;
-
- SndBuffer = (char*) curVoice->curPtr;
-
- VolPtr2 = (Ptr) ( intDriver->Vol + (long) (((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID] * LRVol)/ (REDUCEVOLUME)) << 8));
- LRVol = 100 - LRVol;
- VolPtr = (Ptr) ( intDriver->Vol + (long) (((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID] * LRVol)/ (REDUCEVOLUME)) << 8));
-
- if( (Ptr) SndBuffer + 1L + (long) ((aCC + aDD * intDriver->ASCBUFFER)>>BYTEDIV) >= curVoice->maxPtr)
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = aCC>>BYTEDIV;
- if( SndBuffer + off + 1L >= (char*) curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- SndBuffer -= curVoice->loopSize;
- if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
- }
- else break;
- }
- tByte = ( LeftWeight * *(SndBuffer + off) +
- RightWeight * *(SndBuffer + off + 1)) >> BYTEDIV; aCC += aDD;
-
- *ASCBuffer++ += *(VolPtr + tByte);
- *ASCBuffer++ += *(VolPtr2 + tByte);
- }
- }
- else
- {
- while( i-- > 0)
- {
- off = aCC>>BYTEDIV;
- if( SndBuffer + off + 1L >= (char*) curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- SndBuffer -= curVoice->loopSize;
- if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
- }
- else break;
- }
- tByte = *(SndBuffer + off); aCC += aDD;
-
- *ASCBuffer++ += *(VolPtr + tByte);
- *ASCBuffer++ += *(VolPtr2 + tByte);
- }
- }
-
- if( curVoice->loopSize > 0) curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
- else { curVoice->samplePtr = 0L; curVoice->curPtr = curVoice->maxPtr; }
- }
- else
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = aCC>>BYTEDIV;
- tByte = ( LeftWeight * *(SndBuffer + off) +
- RightWeight * *(SndBuffer + off + 1)) >> BYTEDIV; aCC += aDD;
-
- *ASCBuffer++ += *(VolPtr + tByte);
- *ASCBuffer++ += *(VolPtr2 + tByte);
- }
- }
- else
- {
- while( i-- > 0)
- {
- off = aCC>>BYTEDIV;
- tByte = *(SndBuffer + off); aCC += aDD;
-
- *ASCBuffer++ += *(VolPtr + tByte);
- *ASCBuffer++ += *(VolPtr2 + tByte);
- }
- }
-
- curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
- }
-
- curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
- }
-
- void Sampler8in16AddDeluxe( Channel *curVoice, register short *ASCBuffer, MADDriverRec *intDriver)
- {
- char *SndBuffer;
- Byte tByte;
- Ptr VolPtr, VolPtr2;
- long i = intDriver->ASCBUFFER, LRVol = intDriver->LeftRight[ curVoice->ID];
- long off;
-
- ///
- long aDD, aCC = curVoice->lAC;
-
- aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / ( curVoice->period * (intDriver->DriverSettings.outPutRate>>16));
- ///
-
-
- if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize == 0) return;
-
- SndBuffer = (char*) curVoice->curPtr;
-
-
- VolPtr2 = (Ptr) ( intDriver->Vol + (long) (((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID] * LRVol)/ (REDUCEVOLUME)) << 8));
- LRVol = 100 - LRVol;
- VolPtr = (Ptr) ( intDriver->Vol + (long) (((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID] * LRVol)/ (REDUCEVOLUME)) << 8));
-
- if( (Ptr) SndBuffer + 2L + 2*(long) ((aCC + aDD * intDriver->ASCBUFFER)>>BYTEDIV) >= curVoice->maxPtr)
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = aCC>>BYTEDIV;
- if( SndBuffer + 2*off + 2L >= (char*) curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- SndBuffer -= curVoice->loopSize;
- if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
- }
- else break;
- }
- tByte = ( LeftWeight * *(SndBuffer + 2*off) +
- RightWeight * *(SndBuffer + 2*off + 2)) >> BYTEDIV; aCC += aDD;
-
- *ASCBuffer++ += *(VolPtr + tByte);
- *ASCBuffer++ += *(VolPtr2 + tByte);
- }
- }
- else
- {
- while( i-- > 0)
- {
- off = aCC>>BYTEDIV;
- if( SndBuffer + 2*off + 2L >= (char*) curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- SndBuffer -= curVoice->loopSize;
- if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
- }
- else break;
- }
- tByte = *(SndBuffer + 2*off); aCC += aDD;
-
- *ASCBuffer++ += *(VolPtr + tByte);
- *ASCBuffer++ += *(VolPtr2 + tByte);
- }
- }
-
- if( curVoice->loopSize > 0) curVoice->curPtr = (Ptr) (SndBuffer + (long) 2*(long) (aCC>>BYTEDIV));
- else { curVoice->samplePtr = 0L; curVoice->curPtr = curVoice->maxPtr; }
- }
- else
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = aCC>>BYTEDIV;
- tByte = ( LeftWeight * *(SndBuffer + 2*off) +
- RightWeight * *(SndBuffer + 2*off + 2)) >> BYTEDIV; aCC += aDD;
-
- *ASCBuffer++ += *(VolPtr + tByte);
- *ASCBuffer++ += *(VolPtr2 + tByte);
- }
- }
- else
- {
- while( i-- > 0)
- {
- off = aCC>>BYTEDIV;
- tByte = *(SndBuffer + 2*off); aCC += aDD;
-
- *ASCBuffer++ += *(VolPtr + tByte);
- *ASCBuffer++ += *(VolPtr2 + tByte);
- }
- }
-
- curVoice->curPtr = (Ptr) (SndBuffer + 2*(long) (aCC>>BYTEDIV));
- }
-
- curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
- }
-
- void Sample8BufferAddDeluxe( Channel *curVoice, register short *ASCBuffer, MADDriverRec *intDriver)
- {
- if( curVoice->amp == 16) Sampler8in16AddDeluxe( curVoice, ASCBuffer, intDriver);
- else Sampler8in8AddDeluxe( curVoice, ASCBuffer, intDriver);
- }
-
- void Play8StereoDeluxe( MADDriverRec *intDriver)
- {
- long i;
- short *ttt;
- Ptr ASCBuffer;
-
- for( i = 0 ; i < intDriver->DriverSettings.numChn; i++) Sample8BufferAddDeluxe ( &intDriver->chan[i], intDriver->DASCBuffer8, intDriver);
-
- ttt = intDriver->DASCBuffer8;
- ASCBuffer = intDriver->IntDataPtr;
-
- i = intDriver->ASCBUFFER*2;
- while( i-- > 0)
- {
- *ASCBuffer++ = *(intDriver->OverShoot + *ttt);
- *ttt++ = 0;
- }
- }
-